package de.hdu.pms.ho.dao;

import java.util.List;

import org.springframework.orm.hibernate3.HibernateTemplate;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

import de.hdu.pms.ho.model.Arbeitsplan;
import de.hdu.pms.ho.model.Personal;
import de.hdu.pms.ho.model.Zimmer;



/**
 * Class for all necessary functions with {@link Arbeitsplan} content
 * @author Helena Semmel
 *
 */
public class ArbeitsplanDao extends HibernateDaoSupport{


	
	/**
	 * Returns a list of all allocated works from the db
	 * @return all {@link Arbeitsplan} objects
	 */
	public List<Arbeitsplan> findAll(){
		HibernateTemplate template = getHibernateTemplate();
		List<Arbeitsplan> results = template.loadAll(Arbeitsplan.class);
		return (List<Arbeitsplan>) results;
	}
	
	/**
	 * Returns a single Arbeitsplan by its primary key
	 * @param id the primary key of a {@link Arbeitsplan}
	 * @return a single Arbeitsplan
	 */
	public Arbeitsplan findById(Integer id){
		HibernateTemplate template = getHibernateTemplate();
		return (Arbeitsplan) template.get(Arbeitsplan.class, id);
		
	}
	
	/**
	 * Saves a specified object in the db, a new one, or updates an existing object
	 * @param arbeitsplan an object of {@link Arbeitsplan} that should be saved
	 * @return the {@link Arbeitsplan} object
	 */
	public Arbeitsplan save(Arbeitsplan arbeitsplan){
		HibernateTemplate template = getHibernateTemplate();
		template.saveOrUpdate(arbeitsplan);
		return arbeitsplan;
	}
	
	/**
	 * Deletes a specified object in the db
	 * @param arbeitsplan the object that should be deleted
	 */
	public void delete(Arbeitsplan arbeitsplan){
		HibernateTemplate template = getHibernateTemplate();
		template.delete(arbeitsplan);
	}
	
	
	/**
	 * Deletes a specified object in the db
	 * @param id primary key of the object that should be deleted
	 */
	public void deletebyId(Integer id){								//aufgrund der NestedServletException
		HibernateTemplate template = getHibernateTemplate();
		Arbeitsplan plan = findById(id);
		template.delete(plan);
		template.flush();
	}
	
	
	/**
	 * Creates a new object of {@link Arbeitsplan}
	 * @param personal the object of {@link Personal}
	 * @param zimmer the object of {@link Zimmer}
	 * @param arbeitsbeginn the beginning of the working time period
	 * @param arbeitsende the ending of the working time period
	 */
	public Integer create(Personal personal, Zimmer zimmer, String arbeitsbeginn, String arbeitsende){
		HibernateTemplate template = getHibernateTemplate();
		Arbeitsplan plan = new Arbeitsplan(personal, zimmer, arbeitsbeginn, arbeitsende);
		template.persist(plan);
		return plan.getId();
	}
	
	/**
	 * Changes an existing object of {@link Arbeitsplan}
	 * @param id the primary key of a {@link Arbeitsplan}
	 * @param personal the object of {@link Personal}
	 * @param zimmer the object of {@link Zimmer}
	 * @param beginn the new date
	 * @param ende the new date
	 */
	public void modify(Integer id, Personal personal, Zimmer zimmer, String beginn, String ende) { 	
		HibernateTemplate template = getHibernateTemplate();
		//Session session = template.getSessionFactory().openSession();
		Arbeitsplan plan = (Arbeitsplan)template.get(Arbeitsplan.class, id);
		//session.beginTransaction();
		plan.setPersonal(personal);
		plan.setZimmer(zimmer);
		plan.setArbeitsbeginn(beginn);
		plan.setArbeitsende(ende);
		template.saveOrUpdate(plan);
	}
	
	
	
/*	@SuppressWarnings({"unchecked", "rawtypes"})
	public Set<PersonalZimmerDTO> findAllDTO() {
		HibernateTemplate template = getHibernateTemplate();							
		return(Set<PersonalZimmerDTO>) template.execute(new HibernateCallback() {		
		public Object doInHibernate(Session session)									
				throws HibernateException, SQLException {	
			SQLQuery s = session.createSQLQuery("select * from Arbeitsplan");						//kann aber nur mit session benutzt werden mit native sql
			//Criteria criteria = session.createCriteria(Arbeitsplan.class);				//oder mit criteria, oder mit HQL
			//List<Arbeitsplan> allePläne = criteria.list();								
			return createDtoSet(allePläne);
			
		}// das mit dem execute HibernateCallback braucht man wegen lazy loading, weil man mehrere tabellen aufruft, um session aufrechtzuerhalten
		
		
		});
		
	}*/
	
	

	
	
	
	
}
